#!/usr/bin/env Rscript

##########################################
### 系数矩阵 (coeffcient matrix)
##########################################
r1 = c(1, -2, 1)
r2 = c(0, 2, -8)
r3 = c(-4, 5, 9)
coe = rbind(r1, r2, r3)

rownames(coe) = paste("r", seq(1, dim(coe)[1]), sep = "")
colnames(coe) = paste("x", seq(1, dim(coe)[2]), sep = "")

##########################################
### 增广矩阵 (augmented matrix)
##########################################
b = c(0, 8, -9)
aug = cbind(coe, b)

colnames(aug)[4] <- "y"


##########################################
### 高斯消去(Gauss-Jordan elimination)
##########################################
library("pracma")
help("rref")  # reduced row echelon form
rref(aug)

A = rbind(c(0,-3,-6,4,9),
          c(-1,-2,-1,3,1),
          c(-2,-3,0,3,-1),
          c(1,4,5,-9,-7))
rref(A)

B = rbind(c(0,3,-6,6,4,-5),
          c(3,-7,8,-5,8,9),
          c(3,-9,12,-9,6,15))
rref(B)


##########################################
### 基本变量和自由变量
### 主元列--> 基本变量 (化简后列上有非0值)
### 存在自由变量 --> 有通解
### R3 坐标系中, 有通解表示解再两个平面的交线上
##########################################

##########################################
### 线性组合 (理解几何意义) ---> 很重要的一课
### 向量加法的平行四边型法则 v, u, 0, (v+u) 
### 线性代数的主要思想: 
### TODO: 为某一已知的向量{v1, v2, v3, ... vp}线性组合出的所有向量       
### span{v1, v2, ..., vp} = all c1v1 + c2v2 + ... + cpvp  向量集合
### 组合的意义
### 组合的几何意义
### 某一向量的b --> [a1, a2, ..., an]线性组合--> 这个b应该就是span中的一个
##########################################


############################################################
### 矩阵方程Ax = b
### 向量的线性组合看作[矩阵]与[向量]的积
### 矩阵 ---> 用来线性组合的列向量的组成
### 向量 ---> 线性组合时用到的常数组成
### >>>>> 矩阵方程, 向量方程, 线性方程组 <<<<<<
############################################################

############################################################
### Test
############################################################
A = cbind(c(1,-4,-3),
          c(3,2,-2),
          c(4,-6,-7),
          c(-5, -5, 0))
rref(A)

############################################################
### 齐次方程  Ax = 0
### 非齐次    Ax = b
### 通解的几何意义
############################################################

############################################################
### 矩阵变换 一个空间--> 另一个空间 (映射像)
### Ax = b --> T(x)
### A的n列 --> T的定义域R(n) ,  A每列m个元素--> T的余定义域
### m > n --> 原像
### m < n --> 投影
### m = n --> 剪切,拉伸等变换
############################################################
